package com.habdqn.studentmanager.util;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import com.habdqn.studentmanager.constant.Constant;
import com.habdqn.studentmanager.exception.StudentException;

/**
 * @author Fan 文件工具类 2017年5月13日
 * 
 */
public class FileUtil {

	private static Logger logger = LoggerFactory.getLogger(FileUtil.class);
	
	/**
	 * 将一个spirng文件对象移动到新的路径下
	 * 
	 * @param file
	 * @param destPath 目录的绝对路径
	 * @param name 新文件的文件名
	 */
	public static void move(CommonsMultipartFile file, String destPath, String name) {
		File newFile = new File(destPath + File.separator + name);
		try {
			File parent = newFile.getParentFile();
			// 当创建目录返回值为失败时，且目录不存在
			if (!parent.mkdirs() && !parent.exists()) {
				throw new StudentException("目录创建失败");
			}
			file.transferTo(newFile);
		} catch (IOException e) {
			throw new StudentException("文件上传失败", e);
		}
	}
	
	/**
	 * 获取文件的后缀名
	 * @param file
	 * @return
	 */
	public static String getSuffix(CommonsMultipartFile file) {
		return getSuffix(file.getOriginalFilename());
	}
	
	/**
	 * 获取文件的后缀名
	 * @param file
	 * @return
	 */
	public static String getSuffix(String path) {
		if (StringUtils.isEmpty(path)) {
			return "";
		}
		
		int index = path.indexOf(".");
		
		// 没找到
		if (-1 == index) {
			return "";
		}
		
		// 只去.号后面的字符串
		index++;
		// 找到了，但是在末尾
		if (index >= path.length()) {
			return "";
		}
		
		return path.substring(index);
	}
	
	public static FFile startCreateFile() {
		return new FFile();
	}
	
	public static class FFile {
		
		/**
		 * 文件路径
		 */
		private String path;
		
		private Writer fw;
		
		public FFile path(String path) {
			this.path = path;
			return this;
		}
		
		/**
		 * 打开一个文件, 如果不存在则创建
		 * @param path
		 * @return
		 */
		public FFile open() {
			File file = new File(path);
			
			try {
				if (!file.exists()) {
					if (!file.getParentFile().mkdirs()) {
						throw new StudentException("创建上层目录失败:" + path);
					}
					
					if (!file.createNewFile()) {
						throw new StudentException("创建文件失败:" + path);
					}
				}
				
				fw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true), Constant.UTF8));
				return this;
			}
			catch (IOException e) {
				throw new StudentException("操作文件失败", e);
			}
		}
		
		/**
		 * 写入内容
		 * @param content
		 * @return
		 */
		public FFile write(String content) {
			try {
				fw.write(content);
			}
			catch (IOException e) {
				logger.error("写入文件失败", e);
			}
			return this;
		}
		
		/**
		 * 写入并换行
		 * @param content
		 * @return
		 */
		public FFile writeln(String content) {
			write(content);
			write(Constant.LINE_SEPARATOR);
			return this;
		}
		
		/**
		 * flush
		 * @return
		 */
		public FFile flush() {
			try {
				fw.flush();
			}
			catch (IOException e) {
				logger.error("flush文件失败", e);
			}
			return this;
		}
		
		/**
		 * 关闭资源
		 */
		public void close() {
			try {
				fw.close();
			}
			catch (IOException e) {
				logger.error("关闭文件失败", e);
			}
		}
	}
}
